<?php

class PluginContentwedding_ActionNews extends ActionPlugin
{
    protected $sUserLogin = null;
    protected $aBadNewsUrl = array('admin');

    public function Init()
    {
    }

    /**
     * Регистрируем евенты
     *
     */
    protected function RegisterEvent()
    {
        $this->AddEvent('admin', 'EventAdmin');
        $this->AddEventPreg('/^[\w\-\_]*$/i', 'EventShowNews');
    }

    /**********************************************************************************
     ************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
     **********************************************************************************
     */

    /**
     * Отображение страницы
     *
     * @return unknown
     */
    protected function EventShowNews()
    {
        if (!$this->sCurrentEvent) {
            /**
             * Показывает дефолтную страницу
             */
            //а это какая страница?
        }
        /**
         * Составляем полный URL страницы для поиска по нему в БД
         */
        $sUrlFull = join('/', $this->GetParams());
        if ($sUrlFull != '') {
            $sUrlFull = $this->sCurrentEvent . '/' . $sUrlFull;
        } else {
            $sUrlFull = $this->sCurrentEvent;
        }
        /**
         * Ищем страничку в БД
         */
        if (!($oPage = $this->PluginContentwedding_News_GetPageByUrlFull($sUrlFull, 1))) {
            return $this->EventNotFound();
        }
        /**
         * Заполняем HTML теги и SEO
         */
        $this->Viewer_AddHtmlTitle($oPage->getTitle());
        if ($oPage->getSeoKeywords()) {
            $this->Viewer_SetHtmlKeywords($oPage->getSeoKeywords());
        }
        if ($oPage->getSeoDescription()) {
            $this->Viewer_SetHtmlDescription($oPage->getSeoDescription());
        }

        $this->Viewer_Assign('oPage', $oPage);
        /**
         * Устанавливаем шаблон для вывода
         */
        $this->SetTemplateAction('news');
    }

    /**
     * Админка статическими страницами
     *
     */
    protected function EventAdmin()
    {
        /**
         * Если пользователь не авторизован и не админ, то выкидываем его
         */
        $this->oUserCurrent = $this->User_GetUserCurrent();
        if (!$this->oUserCurrent or !$this->oUserCurrent->isAdministrator()) {
            return $this->EventNotFound();
        }

        $this->Viewer_AddHtmlTitle($this->Lang_Get('plugin.contentWedding.admin'));
        /**
         * Обработка создания новой странички
         */
        if (isPost('submit_news_save')) {
            if (!getRequest('news_id')) {
                $this->SubmitAddNews();
            }
        }
        /**
         * Обработка показа странички для редактирования
         */
        if ($this->GetParam(0) == 'edit') {
            if ($oPageEdit = $this->PluginContentwedding_News_GetPageById($this->GetParam(1))) {
                if (!isPost('submit_news_save')) {
                    $_REQUEST['news_title'] = $oPageEdit->getTitle();
                    $_REQUEST['news_pid'] = $oPageEdit->getPid();
                    $_REQUEST['news_url'] = $oPageEdit->getUrl();
                    $_REQUEST['news_text'] = $oPageEdit->getText();
                    $_REQUEST['news_seo_keywords'] = $oPageEdit->getSeoKeywords();
                    $_REQUEST['news_seo_description'] = $oPageEdit->getSeoDescription();
                    $_REQUEST['news_active'] = $oPageEdit->getActive();
                    $_REQUEST['news_main'] = $oPageEdit->getMain();
                    $_REQUEST['news_sort'] = $oPageEdit->getSort();
                    $_REQUEST['news_auto_br'] = $oPageEdit->getAutoBr();
                    $_REQUEST['news_id'] = $oPageEdit->getId();
                } else {
                    /**
                     * Если отправили форму с редактированием, то обрабатываем её
                     */
                    $this->SubmitEditNews($oPageEdit);
                }
                $this->Viewer_Assign('oPageEdit', $oPageEdit);
            } else {
                $this->Message_AddError($this->Lang_Get('plugin.contentWedding.edit_notfound'), $this->Lang_Get('error'));
                $this->SetParam(0, null);
            }
        }
        /**
         * Обработка удаления страницы
         * Замечание: если используется тип таблиц MyISAM, а InnoDB то возможно некорректное удаление вложенных страниц
         */
        if ($this->GetParam(0) == 'delete') {
            $this->Security_ValidateSendForm();
            if ($this->PluginContentwedding_News_deletePageById($this->GetParam(1))) {
                $this->Message_AddNotice($this->Lang_Get('plugin.contentWedding.admin_action_delete_ok'));
            } else {
                $this->Message_AddError(
                    $this->Lang_Get('plugin.contentWedding.admin_action_delete_error'), $this->Lang_Get('error')
                );
            }
        }
        /**
         * Обработка изменения сортировки страницы
         */
        if ($this->GetParam(0) == 'sort' and $oPage = $this->PluginContentwedding_News_GetPageById($this->GetParam(1))
        ) {
            $this->Security_ValidateSendForm();
            $sWay = $this->GetParam(2) == 'down' ? 'down' : 'up';
            $iSortOld = $oPage->getSort();
            if ($oPagePrev = $this->PluginContentwedding_News_GetNextPageBySort($iSortOld, $oPage->getPid(), $sWay)) {
                $iSortNew = $oPagePrev->getSort();
                $oPagePrev->setSort($iSortOld);
                $this->PluginContentwedding_News_UpdatePage($oPagePrev);
            } else {
                if ($sWay == 'down') {
                    $iSortNew = $iSortOld - 1;
                } else {
                    $iSortNew = $iSortOld + 1;
                }
            }
            /**
             * Меняем значения сортировки местами
             */
            $oPage->setSort($iSortNew);
            $this->PluginContentwedding_News_UpdatePage($oPage);
        }
        /**
         * Получаем и загружаем список всех страниц
         */
        $aPages = $this->PluginContentwedding_News_GetPages();
        if (count($aPages) == 0 and $this->PluginContentwedding_News_GetCountPage()) {
            $this->PluginContentwedding_News_SetPagesPidToNull();
            $aPages = $this->PluginContentwedding_News_GetPages();
        }
        $this->Viewer_Assign('aPages', $aPages);
    }

    /**
     * Обработка отправки формы при редактировании страницы
     *
     * @param unknown_type $oPageEdit
     */
    protected function SubmitEditNews($oPageEdit)
    {
        /**
         * Проверяем корректность полей
         */
        if (!$this->CheckNewsFields()) {
            return;
        }
        if ($oPageEdit->getId() == getRequest('news_pid')) {
            $this->Message_AddError($this->Lang_Get('system_error'));
            return;
        }

        /**
         * Обновляем свойства страницы
         */
        $oPageEdit->setActive(getRequest('news_active') ? 1 : 0);
        $oPageEdit->setAutoBr(getRequest('news_auto_br') ? 1 : 0);
        $oPageEdit->setMain(getRequest('news_main') ? 1 : 0);
        $oPageEdit->setDateEdit(date("Y-m-d H:i:s"));
        if (getRequest('news_pid') == 0) {
            $oPageEdit->setUrlFull(getRequest('news_url'));
            $oPageEdit->setPid(null);
        } else {
            $oPageEdit->setPid(getRequest('news_pid'));
            $oPageParent = $this->PluginContentwedding_News_GetPageById(getRequest('news_pid'));
            $oPageEdit->setUrlFull($oPageParent->getUrlFull() . '/' . getRequest('news_url'));
        }
        $oPageEdit->setSeoDescription(getRequest('news_seo_description'));
        $oPageEdit->setSeoKeywords(getRequest('news_seo_keywords'));
        $oPageEdit->setText(getRequest('news_text'));
        $oPageEdit->setTitle(getRequest('news_title'));
        $oPageEdit->setUrl(getRequest('news_url'));
        $oPageEdit->setSort(getRequest('news_sort'));
        /**
         * Обновляем страницу
         */
        if ($this->PluginContentwedding_News_UpdatePage($oPageEdit)) {
            $this->PluginContentwedding_News_RebuildUrlFull($oPageEdit);
            $this->Message_AddNotice($this->Lang_Get('plugin.contentWedding.edit_submit_save_ok'));
            $this->SetParam(0, null);
            $this->SetParam(1, null);
        } else {
            $this->Message_AddError($this->Lang_Get('system_error'));
        }
    }

    /**
     * Обработка отправки формы добавления новой страницы
     *
     */
    protected function SubmitAddNews()
    {
        /**
         * Проверяем корректность полей
         */
        if (!$this->CheckNewsFields()) {
            return;
        }
        /**
         * Заполняем свойства
         */
        $oPage = Engine::GetEntity('PluginContentwedding_News');
        $oPage->setActive(getRequest('news_active') ? 1 : 0);
        $oPage->setAutoBr(getRequest('news_auto_br') ? 1 : 0);
        $oPage->setMain(getRequest('news_main') ? 1 : 0);
        $oPage->setDateAdd(date("Y-m-d H:i:s"));
        if (getRequest('news_pid') == 0) {
            $oPage->setUrlFull(getRequest('news_url'));
            $oPage->setPid(null);
        } else {
            $oPage->setPid(getRequest('news_pid'));
            $oPageParent = $this->PluginContentwedding_News_GetPageById(getRequest('news_pid'));
            $oPage->setUrlFull($oPageParent->getUrlFull() . '/' . getRequest('news_url'));
        }
        $oPage->setSeoDescription(getRequest('news_seo_description'));
        $oPage->setSeoKeywords(getRequest('news_seo_keywords'));
        $oPage->setText(getRequest('news_text'));
        $oPage->setTitle(getRequest('news_title'));
        $oPage->setUrl(getRequest('news_url'));
        if (getRequest('news_sort')) {
            $oPage->setSort(getRequest('news_sort'));
        } else {
            $oPage->setSort($this->PluginContentwedding_News_GetMaxSortByPid($oPage->getPid()) + 1);
        }
        /**
         * Добавляем страницу
         */
        if ($this->PluginContentwedding_News_AddPage($oPage)) {
            $this->Message_AddNotice($this->Lang_Get('plugin.contentWedding.create_submit_save_ok'));
            $this->SetParam(0, null);
        } else {
            $this->Message_AddError($this->Lang_Get('system_error'));
        }
    }

    /**
     * Проверка полей на корректность
     *
     * @return unknown
     */
    protected function CheckNewsFields()
    {
        $this->Security_ValidateSendForm();

        $bOk = true;
        /**
         * Проверяем есть ли заголовок топика
         */
        if (!func_check(getRequest('news_title', null, 'post'), 'text', 2, 200)) {
            $this->Message_AddError($this->Lang_Get('plugin.contentWedding.create_title_error'), $this->Lang_Get('error'));
            $bOk = false;
        }
        /**
         * Проверяем есть ли заголовок топика, с заменой всех пробельных символов на "_"
         */
        $pageUrl = preg_replace("/\s+/", '_', (string)getRequest('news_url', null, 'post'));
        $_REQUEST['news_url'] = $pageUrl;
        if (!func_check(getRequest('news_url', null, 'post'), 'login', 1, 50)) {
            $this->Message_AddError($this->Lang_Get('plugin.contentWedding.create_url_error'), $this->Lang_Get('error'));
            $bOk = false;
        }
        /**
         * Проверяем на счет плохих УРЛов
         */
        if (in_array(getRequest('news_url', null, 'post'), $this->aBadNewsUrl)) {
            $this->Message_AddError(
                $this->Lang_Get('plugin.contentWedding.create_url_error_bad') . ' ' . join(',', $this->aBadNewsUrl),
                $this->Lang_Get('error')
            );
            $bOk = false;
        }
        /**
         * Проверяем есть ли содержание страницы
         */
        if (!func_check(getRequest('news_text', null, 'post'), 'text', 1, 50000)) {
            $this->Message_AddError($this->Lang_Get('plugin.contentWedding.create_text_error'), $this->Lang_Get('error'));
            $bOk = false;
        }
        /**
         * Проверяем страницу в которую хотим вложить
         */
        if (getRequest('news_pid') != 0 and !(
        $oPageParent = $this->PluginContentwedding_News_GetPageById(getRequest('news_pid')))
        ) {
            $this->Message_AddError($this->Lang_Get('plugin.contentWedding.create_parent_page_error'), $this->Lang_Get('error'));
            $bOk = false;
        }
        /**
         * Проверяем сортировку
         */
        if (getRequest('news_sort') and !is_numeric(getRequest('news_sort'))) {
            $this->Message_AddError($this->Lang_Get('plugin.contentWedding.create_sort_error'), $this->Lang_Get('error'));
            $bOk = false;
        }
        /**
         * Выполнение хуков
         */
        $this->Hook_Run('check_page_fields', array('bOk'=> &$bOk));

        return $bOk;
    }
}

?>